import hashlib


class HashValue:
    @staticmethod
    def get_file_md5(file_path: str, hash_type: str = 'md5') -> str:
        """计算文件的MD5哈希值（二进制安全读取）
        
        Args:
            file_path: 需要计算哈希的文件路径
            
        Returns:
            32位十六进制哈希字符串
            
        Raises:
            ValueError: 当文件无法读取时抛出
            :param hash_type:
        """
        hash_md5 = hashlib.new(hash_type)
        try:
            with open(file_path, 'rb') as f:
                for chunk in iter(lambda: f.read(4096), b''):
                    hash_md5.update(chunk)
        except (IOError, PermissionError) as e:
            raise ValueError(f"无法读取文件: {file_path}") from e
        return hash_md5.hexdigest()

    @staticmethod
    def get_text_md5(text: str, hash_type: str = 'md5', encoding: str = 'utf-8') -> str:
        """计算文本字符串的MD5哈希值
        
        Args:
            text: 需要计算哈希的文本内容
            encoding: 文本编码方式（默认UTF-8）
            
        Returns:
            32位十六进制哈希字符串
            :param hash_type: 默认为md5
        """
        return hashlib.new(hash_type, text.encode(encoding)).hexdigest()


if __name__ == '__main__':
    # 演示两种使用场景
    print("文本哈希:", HashValue.get_text_md5("Hello World"))  # 文本直接计算
    print("文件哈希:", HashValue.get_file_md5(__file__))  # 文件内容计算
